deltas: Include an endianness marker
authorColin Walters <walters@verbum.org>
Tue, 23 Feb 2016 16:00:18 +0000 (11:00 -0500)
committerColin Walters <walters@verbum.org>
Fri, 26 Feb 2016 13:19:01 +0000 (08:19 -0500)
We screwed up and had delta integers use host endianness.  Start
digging out by at least annotating the endianness.

https://bugzilla.gnome.org/show_bug.cgi?id=762515

src/libostree/ostree-repo-static-delta-compilation.c
src/libostree/ostree-repo-static-delta-core.c
tests/test-delta.sh

index 2071bb68e976441a92c6aa568a032c3a371ccef8..e579e9103e4b29c840c884e60e88325c20c6f137 100644 (file)
@@ -1306,6 +1306,10 @@ ostree_repo_static_delta_generate (OstreeRepo                   *self,
                                   cancellable, error))
     goto out;
 
+  /* NOTE: Add user-supplied metadata first.  This is used by at least
+   * xdg-app as a way to provide MIME content sniffing, since the
+   * metadata appears first in the file.
+   */
   g_variant_builder_init (&metadata_builder, G_VARIANT_TYPE ("a{sv}"));
   if (metadata != NULL)
     {
@@ -1320,6 +1324,21 @@ ostree_repo_static_delta_generate (OstreeRepo                   *self,
         }
     }
 
+  { guint8 endianness_char;
+    switch (G_BYTE_ORDER)
+      {
+      case G_LITTLE_ENDIAN:
+        endianness_char = 'l';
+        break;
+      case G_BIG_ENDIAN:
+        endianness_char = 'B';
+        break;
+      default:
+        g_assert_not_reached ();
+      }
+    g_variant_builder_add (&metadata_builder, "{sv}", "ostree.endianness", g_variant_new_byte (endianness_char));
+  }
+
   if (opt_filename)
     {
       g_autoptr(GFile) f = g_file_new_for_path (opt_filename);
index ea5842f7d877ca4053a6381aaa636981c9d44275..6b1dc571ead9be1dbb160ac2d0eb2f6b992855a1 100644 (file)
@@ -678,6 +678,8 @@ _ostree_repo_static_delta_dump (OstreeRepo                    *self,
   g_autofree char *superblock_path = NULL;
   glnx_fd_close int superblock_fd = -1;
   g_autoptr(GVariant) delta_superblock = NULL;
+  g_autoptr(GVariant) delta_meta = NULL;
+  g_autoptr(GVariantDict) delta_metadict = NULL;
   guint64 total_size = 0, total_usize = 0;
   guint64 total_fallback_size = 0, total_fallback_usize = 0;
   guint i;
@@ -690,7 +692,33 @@ _ostree_repo_static_delta_dump (OstreeRepo                    *self,
                                TRUE, &delta_superblock, error))
     goto out;
 
+  delta_meta = g_variant_get_child_value (delta_superblock, 0);
+  delta_metadict = g_variant_dict_new (delta_meta);
+
   g_print ("Delta: %s\n", delta_id);
+  { guint8 endianness_char;
+    const char *endianness_description;
+
+    if (g_variant_dict_lookup (delta_metadict, "ostree.endianness", "y", &endianness_char))
+      {
+        switch (endianness_char)
+          {
+          case 'l':
+            endianness_description = "little";
+            break;
+          case 'B':
+            endianness_description = "big";
+            break;
+          default:
+            endianness_description = "invalid";
+            break;
+          }
+      }
+    else
+      endianness_description = "unknown";
+    
+    g_print ("Endianness: %s\n", endianness_description);
+  }
   { guint64 ts;
     g_variant_get_child (delta_superblock, 1, "t", &ts);
     g_print ("Timestamp: %" G_GUINT64_FORMAT "\n", GUINT64_FROM_BE (ts));
index b31d65e9d65dbf5f00094099e6ded27aa56344c5..84ce8a7c305464ead6ce8c5fc4a93e6eaecfbed0 100755 (executable)
@@ -114,6 +114,11 @@ fi
 
 echo 'ok generate'
 
+${CMD_PREFIX} ostree --repo=repo static-delta show ${origrev}-${newrev} > show.txt
+assert_file_has_content show.txt 'Endianness: \(little\|big\)'
+
+echo 'ok show'
+
 mkdir repo2 && ${CMD_PREFIX} ostree --repo=repo2 init --mode=archive-z2
 ${CMD_PREFIX} ostree --repo=repo2 pull-local repo ${newrev}
 ${CMD_PREFIX} ostree --repo=repo2 fsck